home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d11 / frasrc14.arc / PLOT3D.C < prev    next >
Text File  |  1990-08-02  |  9KB  |  314 lines

  1. /* 
  2.    This file includes miscellaneous plot functions and logic
  3.    for funny red/blue glasses 3D. By Tim Wegner and Marc Reinig.
  4. */ 
  5.  
  6. #include <stdio.h>
  7. #include "fractint.h"
  8. #include "fractype.h"
  9.  
  10. /* Use these palette indices for red/blue - same on ega/vga */
  11. #define BLUE         1
  12. #define RED         2
  13. #define MAGENTA        3
  14.  
  15. int whichimage;
  16. extern int fractype;
  17. extern int mapset;
  18. extern int xadjust;
  19. extern int yadjust;
  20. extern int xxadjust;
  21. extern int yyadjust;
  22. extern int xshift;
  23. extern int yshift; 
  24. extern char MAP_name[];
  25. extern int init3d[];
  26. extern int xdots;
  27. extern int ydots;
  28. extern int colors;
  29. extern unsigned char dacbox[256][3];
  30. extern void (*standardplot)();
  31.  
  32. int xxadjust1;
  33. int yyadjust1;
  34. int eyeseparation = 0;
  35. int glassestype = 0;
  36. int xshift1;
  37. int yshift1; 
  38. int xtrans = 0;
  39. int ytrans = 0; 
  40. int red_local_left;
  41. int red_local_right;
  42. int blue_local_left;
  43. int blue_local_right;
  44. int red_crop_left   = 4;
  45. int red_crop_right  = 0;
  46. int blue_crop_left  = 0;
  47. int blue_crop_right = 4;
  48. int red_bright      = 80;
  49. int blue_bright      = 100;
  50.  
  51. /* use this for continuous colors later */
  52. void plot3dsuperimpose16b(int x,int y,int color)
  53. {
  54.    int tmp;
  55.    if (color != 0)             /* Keeps index 0 still 0 */
  56.    {
  57.       color = colors - color; /*  Reverses color order */
  58.       color = color / 4;  
  59.       if(color == 0)
  60.          color = 1;
  61.    }
  62.    color = 3;
  63.    tmp = getcolor(x,y);
  64.  
  65.    /* map to 4 colors */
  66.    if(whichimage == 1) /* RED */
  67.    {
  68.       if(red_local_left < x && x < red_local_right)
  69.          putcolor(x,y,color|tmp);
  70.    }
  71.    else if(whichimage == 2) /* BLUE */
  72.    {
  73.       if(blue_local_left < x && x < blue_local_right)
  74.       {
  75.          color = color <<2;
  76.          putcolor(x,y,color|tmp);
  77.       }
  78.    }
  79. }
  80.  
  81. void plot3dsuperimpose16(int x,int y,int color)
  82. {
  83.    int tmp;
  84.  
  85.    tmp = getcolor(x,y);
  86.  
  87.    if(whichimage == 1) /* RED */
  88.    {
  89.       color = RED;
  90.       if(tmp > 0 && tmp != color)
  91.          color = MAGENTA;
  92.       if(red_local_left < x && x < red_local_right)
  93.          putcolor(x,y,color);
  94.    }
  95.    else if(whichimage == 2) /* BLUE */
  96.    {
  97.       if(blue_local_left < x && x < blue_local_right)
  98.       {
  99.          color = BLUE;
  100.          if(tmp > 0 && tmp != color)
  101.             color = MAGENTA;
  102.          putcolor(x,y,color);
  103.       }
  104.    }
  105. }
  106.  
  107. void plot3dsuperimpose256(x,y,color)
  108. {
  109.    int tmp;
  110.    if (color != 0)             /* Keeps index 0 still 0 */
  111.    {
  112.       color = colors - color; /*  Reverses color order */
  113.       color = 1 + color / 18; /*  Maps colors 1-255 to 15 even ranges */
  114.    }
  115.    tmp = getcolor(x,y);
  116.    /* map to 16 colors */
  117.    if(whichimage == 1) /* RED */
  118.    {
  119.       if(red_local_left < x && x < red_local_right)
  120.       /* Overwrite prev Red don't mess w/blue */
  121.          putcolor(x,y,color|(tmp&240));
  122.    }
  123.    else if(whichimage == 2) /* BLUE */
  124.    {
  125.       if(blue_local_left < x && x < blue_local_right)
  126.       {
  127.          /* Overwrite previous blue, don't mess with existing red */
  128.          color = color <<4;
  129.          putcolor(x,y,color|(tmp&15));
  130.       }
  131.    }
  132. }
  133.  
  134. void plotIFS3dsuperimpose256(x,y,color)
  135. {
  136.    int tmp;
  137.    if (color != 0)             /* Keeps index 0 still 0 */
  138.    {
  139.       /* my mind is fried - lower indices = darker colors is EASIER! */
  140.       color = colors - color; /*  Reverses color order */
  141.       color = 1 + color / 18; /*  Looks weird but maps colors 1-255 to 15
  142.                                          relatively even ranges */
  143.    }
  144.    tmp = getcolor(x,y);
  145.    /* map to 16 colors */
  146.    if(whichimage == 1) /* RED */
  147.    {
  148.       if(red_local_left < x && x < red_local_right)
  149.          putcolor(x,y,color|tmp);
  150.    }
  151.    else if(whichimage == 2) /* BLUE */
  152.    {
  153.       if(blue_local_left < x && x < blue_local_right)
  154.       {
  155.          color = color <<4;
  156.          putcolor(x,y,color|tmp);
  157.       }
  158.    }
  159. }
  160.  
  161. void plot3dalternate(x,y,color)
  162. {
  163.    /* lorez high color red/blue 3D plot function */
  164.    /* if which image = 1, compresses color to lower 128 colors */
  165.  
  166.    /* my mind is STILL fried - lower indices = darker colors is EASIER! */
  167.    color = colors - color; 
  168.    if((whichimage == 1) && !((x+y)&1)) /* - lower half palette */
  169.    {
  170.       if(red_local_left < x && x < red_local_right) 
  171.          putcolor(x,y,color>>1);
  172.    }
  173.    else if((whichimage == 2) && ((x+y)&1) ) /* - upper half palette */
  174.    {
  175.       if(blue_local_left < x && x < blue_local_right) 
  176.          putcolor(x,y,(color>>1)+(colors>>1));
  177.    }
  178. }
  179.  
  180. plot_setup()
  181. {
  182.    double d_red_bright, d_blue_bright;
  183.    int i;
  184.  
  185.    /* set funny glasses plot function */
  186.    switch(glassestype)
  187.    {
  188.    case 1:
  189.       standardplot = plot3dalternate;
  190.       break;  
  191.    case 2:
  192.       if(colors == 256)
  193.          if (fractype != IFS3D)
  194.             standardplot = plot3dsuperimpose256;
  195.          else
  196.             standardplot = plotIFS3dsuperimpose256;
  197.       else
  198.          standardplot = plot3dsuperimpose16;
  199.       break;
  200.    default:
  201.       standardplot = putcolor;
  202.       break;
  203.    }
  204.  
  205.    xshift1 = xshift = (XSHIFT * (double)xdots)/100;
  206.    yshift1 = yshift = (YSHIFT * (double)ydots)/100;
  207.  
  208.    if(glassestype)
  209.    {
  210.       red_local_left   =    (red_crop_left           * (double)xdots)/100.0;  
  211.       red_local_right  =    ((100 - red_crop_right)  * (double)xdots)/100.0; 
  212.       blue_local_left  =    (blue_crop_left          * (double)xdots)/100.0; 
  213.       blue_local_right =    ((100 - blue_crop_right) * (double)xdots)/100.0;
  214.       d_red_bright     =    (double)red_bright/100.0;
  215.       d_blue_bright    =    (double)blue_bright/100.0;
  216.  
  217.       switch(whichimage)
  218.       {
  219.       case 1:
  220.          xshift  += (eyeseparation* (double)xdots)/200;
  221.          xxadjust = ((xtrans+xadjust)* (double)xdots)/100;
  222.          xshift1  -= (eyeseparation* (double)xdots)/200;
  223.          xxadjust1 = ((xtrans-xadjust)* (double)xdots)/100;
  224.          break;
  225.       case 2:          
  226.          xshift  -= (eyeseparation* (double)xdots)/200;
  227.          xxadjust = ((xtrans-xadjust)* (double)xdots)/100;
  228.          break;
  229.       }
  230.    }
  231.    else
  232.       xxadjust = (xtrans* (double)xdots)/100;
  233.    yyadjust = -(ytrans* (double)ydots)/100;
  234.  
  235.    if (mapset == 1)
  236.    {
  237.       FILE *dacfile;
  238.       dacfile = fopen(MAP_name,"r");
  239.       ValidateLuts(dacfile);  /* read the palette file */
  240.       fclose(dacfile); /* close it */
  241.    } 
  242.    else if (mapset == 2)
  243.    {
  244.       /*
  245.          Creates a palette for superimposed-pixel red/blue 3D.
  246.          Top four bits is blue, bottom 4 bits is read. Since
  247.          we need all combinations of red and blue for
  248.          superimposition purposes, we are allowed only
  249.          16 shades of red and blue.
  250.       */
  251.       if(colors == 256)
  252.          for(i=0;i<256;i++)
  253.          {
  254.             dacbox[i][0] = (i%16) << 2;
  255.             dacbox[i][1] = 0;
  256.             dacbox[i][2] = (i/16) << 2;
  257.          }
  258.       else
  259.          for(i=0;i<16;i++)
  260.          {
  261.             dacbox[i][0] = (i%4) << 4;
  262.             dacbox[i][1] = 0;
  263.             dacbox[i][2] = (i/4) << 4;
  264.          }
  265.       ValidateLuts(NULL);  /* setup Targa palette */
  266.    } 
  267.    else if (mapset == 3)
  268.    {
  269.       /*
  270.          Creates a continuous palette map file for alternate
  271.          pixel funny glasses 3D. Colors are repeated, so we
  272.          need 128 color "pseudo" red and blue sequences.
  273.          Also, red seems a little brighter than the blue.
  274.       */
  275.       for(i=0;i<128;i++)
  276.       {
  277.          dacbox[i][0] = (unsigned char)(i >> 1);
  278.          dacbox[i][1] = dacbox[i][2] = 0;
  279.       }
  280.       for(i=0;i<128;i++)
  281.       {
  282.          dacbox[i+128][2] = (unsigned char)(i >> 1);
  283.          dacbox[i+128][0] = dacbox[i+128][1] = 0;
  284.       }
  285.       ValidateLuts(NULL);  /* setup Targa palette */
  286.    }
  287.    if (mapset)
  288.    {
  289.       if(glassestype==1 || glassestype==2)
  290.       {
  291.          if(glassestype == 2 && colors < 256)
  292.          {
  293.             dacbox[RED    ][0] = 63;
  294.             dacbox[RED    ][1] =  0;
  295.             dacbox[RED    ][2] =  0;
  296.  
  297.             dacbox[BLUE   ][0] =  0;
  298.             dacbox[BLUE   ][1] =  0;
  299.             dacbox[BLUE   ][2] = 63;
  300.  
  301.             dacbox[MAGENTA][0] = 63;
  302.             dacbox[MAGENTA][1] =  0;
  303.             dacbox[MAGENTA][2] = 63;
  304.          }
  305.          for (i=0;i<256;i++)
  306.          {
  307.             dacbox[i][0] = dacbox[i][0] * d_red_bright;
  308.             dacbox[i][2] = dacbox[i][2] * d_blue_bright;
  309.          }
  310.       }   
  311.       spindac(0,1); /* load it, but don't spin */
  312.    }
  313. }
  314.